/*
 * Copyright (C) 2024-2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup CryptoAsymKeyApi
 * @{
 *
 * @brief 为应用提供非对称密钥生成和转换算法接口。
 *
 * @since 12
 */

/**
 * @file crypto_asym_key.h
 *
 * @brief 声明非对称密钥接口。
 *
 * @library libohcrypto.so
 * @include <CryptoArchitectureKit/crypto_asym_key.h>
 * @kit CryptoArchitectureKit
 * @syscap SystemCapability.Security.CryptoFramework
 * @since 12
 */

#ifndef CRYPTO_ASYM_KEY_H
#define CRYPTO_ASYM_KEY_H

#include "crypto_common.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 定义密钥对结构体。
 *
 * @since 12
 */
typedef struct OH_CryptoKeyPair OH_CryptoKeyPair;

/**
 * @brief 定义公钥结构体。
 *
 * @since 12
 */
typedef struct OH_CryptoPubKey OH_CryptoPubKey;

/**
 * @brief 定义私钥结构体。
 *
 * @since 20
 */
typedef struct OH_CryptoPrivKey OH_CryptoPrivKey;

/**
 * @brief 定义非对称密钥参数类型。
 *
 * @since 12
 */
typedef enum {
    /** DSA算法的素模数p。 */
    CRYPTO_DSA_P_DATABLOB = 101,
    /** DSA算法中密钥参数q（p-1的素因子）。 */
    CRYPTO_DSA_Q_DATABLOB = 102,
    /** DSA算法的参数g。 */
    CRYPTO_DSA_G_DATABLOB = 103,
    /** DSA算法的私钥sk。 */
    CRYPTO_DSA_SK_DATABLOB = 104,
    /** DSA算法的公钥pk。 */
    CRYPTO_DSA_PK_DATABLOB = 105,
    /** ECC算法中表示椭圆曲线Fp域的素数p。 */
    CRYPTO_ECC_FP_P_DATABLOB = 201,
    /** ECC算法中椭圆曲线的第一个系数a。 */
    CRYPTO_ECC_A_DATABLOB = 202,
    /** ECC算法中椭圆曲线的第二个系数b。 */
    CRYPTO_ECC_B_DATABLOB = 203,
    /** ECC算法中基点g的x坐标。 */
    CRYPTO_ECC_G_X_DATABLOB = 204,
    /** ECC算法中基点g的y坐标。 */
    CRYPTO_ECC_G_Y_DATABLOB = 205,
    /** ECC算法中基点g的阶n。 */
    CRYPTO_ECC_N_DATABLOB = 206,
    /** ECC算法中的余因子h。 */
    CRYPTO_ECC_H_INT = 207,
    /** ECC算法中的私钥sk。 */
    CRYPTO_ECC_SK_DATABLOB = 208,
    /** ECC算法中，公钥pk（椭圆曲线上的一个点）的x坐标。*/
    CRYPTO_ECC_PK_X_DATABLOB = 209,
    /** ECC算法中，公钥pk（椭圆曲线上的一个点）的y坐标。 */
    CRYPTO_ECC_PK_Y_DATABLOB = 210,
    /** ECC算法中，椭圆曲线的域类型（当前只支持Fp域）。 */
    CRYPTO_ECC_FIELD_TYPE_STR = 211,
    /** ECC算法中域的大小，单位为bits（注：对于Fp域，域的大小为素数p的bits长度）。 */
    CRYPTO_ECC_FIELD_SIZE_INT = 212,
    /** ECC算法中的SECG（Standards for Efficient Cryptography Group）曲线名称。 */
    CRYPTO_ECC_CURVE_NAME_STR = 213,

    /** RSA算法中的模数n。 */
    CRYPTO_RSA_N_DATABLOB = 301,
    /** RSA算法中的私钥sk（即私钥指数d）。 */
    CRYPTO_RSA_D_DATABLOB = 302,
    /** RSA算法中的公钥pk（即公钥指数e）。 */
    CRYPTO_RSA_E_DATABLOB = 303,

    /** DH算法中的素数p。 */
    CRYPTO_DH_P_DATABLOB = 401,
    /** DH算法中的参数g。 */
    CRYPTO_DH_G_DATABLOB = 402,
    /** DH算法中私钥长度，单位为bit。 */
    CRYPTO_DH_L_INT = 403,
    /** DH算法中的私钥sk。 */
    CRYPTO_DH_SK_DATABLOB = 404,
    /** DH算法中的公钥pk。 */
    CRYPTO_DH_PK_DATABLOB = 405,

    /** Ed25519算法中的私钥sk。 */
    CRYPTO_ED25519_SK_DATABLOB = 501,
    /** Ed25519算法中的公钥pk。 */
    CRYPTO_ED25519_PK_DATABLOB = 502,
    /** X25519算法中的私钥sk。 */
    CRYPTO_X25519_SK_DATABLOB = 601,
    /** X25519算法中的公钥pk。 */
    CRYPTO_X25519_PK_DATABLOB = 602,
} CryptoAsymKey_ParamType;

/**
 * @brief 定义编码格式。
 *
 * @since 12
 */
typedef enum {
    /** PEM格式密钥类型。 */
    CRYPTO_PEM = 0,
    /** DER格式密钥类型。 */
    CRYPTO_DER = 1,
} Crypto_EncodingType;

/**
 * @brief 定义非对称密钥生成器结构体。
 *
 * @since 12
 */
typedef struct OH_CryptoAsymKeyGenerator OH_CryptoAsymKeyGenerator;

/**
 * @brief 通过指定算法名称的字符串，获取相应的非对称密钥生成器实例。
 *
 * @param algoName 用于生成生成器的算法名称。\n
 * 例如"RSA1024|PRIMES_2"。
 * @param ctx 指向非对称密钥生成器上下文的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_INVALID_PARAMS：参数无效。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 12
 */
OH_Crypto_ErrCode OH_CryptoAsymKeyGenerator_Create(const char *algoName, OH_CryptoAsymKeyGenerator **ctx);

/**
 * @brief 随机生成非对称密钥（密钥对）。
 *
 * @param ctx 非对称密钥生成器实例。
 * @param keyCtx 指向非对称密钥对实例的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_INVALID_PARAMS：参数无效。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 12
 */
OH_Crypto_ErrCode OH_CryptoAsymKeyGenerator_Generate(OH_CryptoAsymKeyGenerator *ctx, OH_CryptoKeyPair **keyCtx);

/**
 * @brief 将非对称密钥数据转换为密钥对。
 *
 * @param ctx 非对称密钥生成器实例。
 * @param type 编码格式。
 * @param pubKeyData 公钥数据。
 * @param priKeyData 私钥数据。
 * @param keyCtx 指向非对称密钥对实例的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_INVALID_PARAMS：参数无效。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 12
 */
OH_Crypto_ErrCode OH_CryptoAsymKeyGenerator_Convert(OH_CryptoAsymKeyGenerator *ctx, Crypto_EncodingType type,
    Crypto_DataBlob *pubKeyData, Crypto_DataBlob *priKeyData, OH_CryptoKeyPair **keyCtx);

/**
 * @brief 获取非对称密钥算法名称。
 *
 * @param ctx 非对称密钥生成器实例。
 * @return 返回非对称密钥算法名称。
 * @since 12
 */
const char *OH_CryptoAsymKeyGenerator_GetAlgoName(OH_CryptoAsymKeyGenerator *ctx);

/**
 * @brief 销毁非对称密钥生成器实例。
 *
 * @param ctx 非对称密钥生成器实例。
 * @since 12
 */
void OH_CryptoAsymKeyGenerator_Destroy(OH_CryptoAsymKeyGenerator *ctx);

/**
 * @brief 销毁非对称密钥对实例。
 *
 * @param keyCtx 密钥对实例。
 * @since 12
 */
void OH_CryptoKeyPair_Destroy(OH_CryptoKeyPair *keyCtx);

/**
 * @brief 从密钥对中获取公钥实例。
 *
 * @param keyCtx 密钥对实例。
 * @return 返回从密钥对中得到的公钥实例。
 * @since 12
 */
OH_CryptoPubKey *OH_CryptoKeyPair_GetPubKey(OH_CryptoKeyPair *keyCtx);

/**
 * @brief 获取密钥对的私钥。
 *
 * @param keyCtx 密钥对实例。
 * @return 返回从密钥对中得到的私钥实例。
 * @since 20
 */
OH_CryptoPrivKey *OH_CryptoKeyPair_GetPrivKey(OH_CryptoKeyPair *keyCtx);

/**
 * @brief 根据指定的编码格式输出公钥数据。
 *
 * @param key 公钥实例。
 * @param type 编码类型。
 * @param encodingStandard 编码格式。
 * @param out 输出的公钥结果。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_INVALID_PARAMS：参数无效。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 12
 */
OH_Crypto_ErrCode OH_CryptoPubKey_Encode(OH_CryptoPubKey *key, Crypto_EncodingType type,
    const char *encodingStandard, Crypto_DataBlob *out);

/**
 * @brief 从公钥实例获取指定参数。
 *
 * @param key 公钥实例。
 * @param item 非对称密钥参数类型。
 * @param value 参数输出值。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_INVALID_PARAMS：参数无效。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 12
 */
OH_Crypto_ErrCode OH_CryptoPubKey_GetParam(OH_CryptoPubKey *key, CryptoAsymKey_ParamType item, Crypto_DataBlob *value);

 /**
 * @brief 设置非对称密钥生成器上下文的密码。
 *
 * @param ctx 指向非对称加密上下文的指针。
 * @param password 表示密码。
 * @param passwordLen 表示密码长度。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeyGenerator_SetPassword(OH_CryptoAsymKeyGenerator *ctx, const unsigned char *password,
    uint32_t passwordLen);

/**
 * @brief 定义私钥编码参数结构体。
 *
 * @since 20
 */
typedef struct OH_CryptoPrivKeyEncodingParams OH_CryptoPrivKeyEncodingParams;

/**
 * @brief 定义私钥编码参数类型。
 *
 * @since 20
 */
typedef enum {
    /** 表示密码字符串。 */
    CRYPTO_PRIVATE_KEY_ENCODING_PASSWORD_STR = 0,

    /** 表示对称加密字符串。 */
    CRYPTO_PRIVATE_KEY_ENCODING_SYMMETRIC_CIPHER_STR = 1,
} CryptoPrivKeyEncoding_ParamType;

/**
 * @brief 创建私钥编码参数。
 *
 * @param ctx 私钥编码参数。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoPrivKeyEncodingParams_Create(OH_CryptoPrivKeyEncodingParams **ctx);

/**
 * @brief 设置私钥编码参数。
 *
 * @param ctx 私钥编码参数。
 * @param type 私钥编码参数类型。
 * @param value 私钥编码参数值。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoPrivKeyEncodingParams_SetParam(OH_CryptoPrivKeyEncodingParams *ctx,
    CryptoPrivKeyEncoding_ParamType type, Crypto_DataBlob *value);

/**
 * @brief 销毁私钥编码参数。
 *
 * @param ctx 私钥编码参数。
 * @since 20
 */
void OH_CryptoPrivKeyEncodingParams_Destroy(OH_CryptoPrivKeyEncodingParams *ctx);

/**
 * @brief 从私钥实例获取指定参数。
 *
 * @param key 私钥。
 * @param type 私钥编码类型。
 * @param encodingStandard 编码标准。\n
 * 例如"PKCS8"。
 * @param params 私钥编码参数，可以为NULL，如果要加密私钥，则应设置此参数。
 * @param out 编码结果。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoPrivKey_Encode(OH_CryptoPrivKey *key, Crypto_EncodingType type,
    const char *encodingStandard, OH_CryptoPrivKeyEncodingParams *params, Crypto_DataBlob *out);

/**
 * @brief 获取私钥的指定参数。
 *
 * @param key 私钥。
 * @param item 非对称密钥参数类型。
 * @param value 输出数据。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoPrivKey_GetParam(OH_CryptoPrivKey *key, CryptoAsymKey_ParamType item,
    Crypto_DataBlob *value);

/**
 * @brief 定义非对称密钥规格结构体。
 *
 * @since 20
 */
typedef struct OH_CryptoAsymKeySpec OH_CryptoAsymKeySpec;

/**
 * @brief 定义非对称密钥规格类型。
 *
 * @since 20
 */
typedef enum {
    /** 通用参数规格。 */
    CRYPTO_ASYM_KEY_COMMON_PARAMS_SPEC = 0,
    /** 私钥规格。 */
    CRYPTO_ASYM_KEY_PRIVATE_KEY_SPEC = 1,
    /** 公钥规格。 */
    CRYPTO_ASYM_KEY_PUBLIC_KEY_SPEC = 2,
    /** 密钥对规格。 */
    CRYPTO_ASYM_KEY_KEY_PAIR_SPEC = 3,
} CryptoAsymKeySpec_Type;

/**
 * @brief 生成EC通用参数规格。
 *
 * @param curveName ECC曲线名称。
 * @param spec 指向EC通用参数规格的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeySpec_GenEcCommonParamsSpec(const char *curveName, OH_CryptoAsymKeySpec **spec);

/**
 * @brief 生成DH通用参数规格。
 *
 * @param pLen 素数p的字节长度。
 * @param skLen 私钥的字节长度。
 * @param spec 指向DH通用参数规格的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeySpec_GenDhCommonParamsSpec(int pLen, int skLen, OH_CryptoAsymKeySpec **spec);

/**
 * @brief 根据给定的算法名称和规格类型创建非对称密钥规格。
 *
 * @param algoName 用于生成规格的算法名称。\n
 * 例如"RSA"。
 * @param type 非对称密钥规格类型。
 * @param spec 指向非对称密钥规格的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeySpec_Create(const char *algoName, CryptoAsymKeySpec_Type type,
    OH_CryptoAsymKeySpec **spec);

/**
 * @brief 设置非对称密钥规格的指定参数。
 *
 * @param spec 非对称密钥规格。
 * @param type 非对称密钥参数类型。
 * @param value 输入数据。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeySpec_SetParam(OH_CryptoAsymKeySpec *spec, CryptoAsymKey_ParamType type,
    Crypto_DataBlob *value);

/**
 * @brief 设置非对称密钥规格的通用参数规格。
 *
 * @param spec 非对称密钥规格。
 * @param commonParamsSpec 通用参数规格。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeySpec_SetCommonParamsSpec(OH_CryptoAsymKeySpec *spec,
    OH_CryptoAsymKeySpec *commonParamsSpec);

/**
 * @brief 获取非对称密钥规格的指定参数。
 *
 * @param spec 非对称密钥规格。
 * @param type 非对称密钥参数类型。
 * @param value 输出数据。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeySpec_GetParam(OH_CryptoAsymKeySpec *spec, CryptoAsymKey_ParamType type,
    Crypto_DataBlob *value);

/**
 * @brief 销毁非对称密钥规格。
 *
 * @param spec 非对称密钥规格。
 * @since 20
 */
void OH_CryptoAsymKeySpec_Destroy(OH_CryptoAsymKeySpec *spec);

/**
 * @brief 定义带规格的非对称密钥生成器。
 *
 * @since 20
 */
typedef struct OH_CryptoAsymKeyGeneratorWithSpec OH_CryptoAsymKeyGeneratorWithSpec;

/**
 * @brief 创建带规格的非对称密钥生成器。
 *
 * @param keySpec 非对称密钥规格。
 * @param generator 带规格的非对称密钥生成器。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeyGeneratorWithSpec_Create(OH_CryptoAsymKeySpec *keySpec,
    OH_CryptoAsymKeyGeneratorWithSpec **generator);

/**
 * @brief 根据非对称密钥规格生成密钥对。
 *
 * @param generator 带规格的非对称密钥生成器。
 * @param keyPair 指向密钥对的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymKeyGeneratorWithSpec_GenKeyPair(OH_CryptoAsymKeyGeneratorWithSpec *generator,
    OH_CryptoKeyPair **keyPair);

/**
 * @brief 销毁带规格的非对称密钥生成器。
 *
 * @param generator 带规格的非对称密钥生成器。
 * @since 20
 */
void OH_CryptoAsymKeyGeneratorWithSpec_Destroy(OH_CryptoAsymKeyGeneratorWithSpec *generator);

/**
 * @brief 定义EC点结构体。
 *
 * @since 20
 */
typedef struct OH_CryptoEcPoint OH_CryptoEcPoint;

/**
 * @brief 创建EC点。
 *
 * @param curveName 曲线名称。
 * @param ecKeyData EC点数据，支持"04 || x || y"、"02 || x"或"03 || x"格式。如果ecKeyData参数为NULL，将创建一个空的EC点规格。
 * @param point 指向EC点的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoEcPoint_Create(const char *curveName, Crypto_DataBlob *ecKeyData, OH_CryptoEcPoint **point);

/**
 * @brief 获取EC点的x和y坐标。
 *
 * @param point EC点。
 * @param x EC点的x坐标,可以为NULL。
 * @param y EC点的y坐标,可以为NULL。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoEcPoint_GetCoordinate(OH_CryptoEcPoint *point, Crypto_DataBlob *x, Crypto_DataBlob *y);

/**
 * @brief 设置EC点的x和y坐标。
 *
 * @param point EC点。
 * @param x EC点的x坐标。
 * @param y EC点的y坐标。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoEcPoint_SetCoordinate(OH_CryptoEcPoint *point, Crypto_DataBlob *x, Crypto_DataBlob *y);

/**
 * @brief 将EC点编码为指定格式。
 *
 * @param point EC点。
 * @param format 编码格式,支持"UNCOMPRESSED"和"COMPRESSED"。
 * @param out 编码后的EC点数据。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoEcPoint_Encode(OH_CryptoEcPoint *point, const char *format, Crypto_DataBlob *out);

/**
 * @brief 销毁EC点。
 *
 * @param point EC点。
 * @since 20
 */
void OH_CryptoEcPoint_Destroy(OH_CryptoEcPoint *point);

#ifdef __cplusplus
}
#endif

/** @} */
#endif /* CRYPTO_ASYM_KEY_H */
